[アップデート] Amazon Linux 2 でカーネルライブパッチが一般利用可能になりました
本日のアップデートで、Amazon Linux 2 のカーネルライブパッチが一般利用可能になりました。
4月にプレビューとしてリリースされていたものですね。
何がうれしいのか
OS を安全および安定的に運用するために、セキュリティ脆弱性やバグ修正に対応するための Linux カーネルのアップデートは欠かせない運用です。しかし、カーネルのアップデートにはアプリケーションの停止や、再起動が必要となるため、アプリーケーションの中断するタイミングを調整する手間が必要となります。
また、その調整によってアップデート適用が遅れることは、リスクのある状態を少なからずとも放置することになりますので、安定・安全を目指す運用メンバーからすれば望ましい状況ではないでしょう。
このアップデートにより、セキュリティ脆弱性やバグに対する修正を実行中のカーネルに適用することが出来るようになり、アプリーケーションのダウンタイムを減らしたメンテナンスが可能となります。
一般的なカーネルライブパッチの仕組み
Amazon Linux 2 におけるカーネルライブパッチの仕組みについて、執筆時点のドキュメントでは記載が見つかりませんでしたので、以下の図は Red Hat の例になります。Amazon Linux 2 でも kpatch
や ftrace
についての記載はありますので、概ね同じと考えてよいのかもしれません。
- カーネルパッチモジュールは、/var/lib/kpatch/ ディレクトリーにコピーされ、次回の起動時に systemd を介して、カーネルへの再適用として登録されます。
- 実行中のカーネルに kpatch モジュールがロードされ、新しいコードのメモリー内の場所を指定するポインターを使用して、このパッチが適用された機能が ftrace メカニズムに登録されます。
- パッチが当てられた機能にカーネルがアクセスすると、ftrace メカニズムにリダイレクトされます。これにより、元々の機能は回避され、パッチを当てたバージョンの機能にカーネルをリダイレクトします。
(引用元:RED HAT ENTERPRISE LINUX 7 カーネル管理ガイド)
AWS Systems Manager Patch Manage でも利用可能に
執筆時点の AWS 公式ガイドを参照すると、「Kernel Live Patching is not supported by AWS Systems Manager Patch Manager.」との記載がありますが、プレビュー時の名残でしょうか。GA に伴って Patch Manage でも利用可能になっているようです。
Q. Does AWS Systems Manager Patch Manager support live patching?
Yes. You can use AWS SSM Patch Manager to automate applying kernel live patches without the need of an immediate reboot when the patch is available as a live patch. Visit the SSM Patch Manager documentation to get started.
(引用元:Amazon Linux 2のよくある質問 )
注意点
前提条件
Amazon Linux 2 でカーネルライブパッチを使用するには、以下の環境である必要があります。
- Amazon Linux 2でサポートされている64ビット(x86_64)アーキテクチャ
- 64ビット ARM(arm64)アーキテクチャはサポートされていません
- カーネルバージョン
4.14.165-131.185以降
の Amazon Linux 2
カーネルバージョンは更新されません
カーネルライブパッチを適用しても、カーネルのバージョンは更新されません。バージョンの更新にはインスタンスが再起動が必要となります。
最新のカーネルライブパッチの提供は 3 ヶ月間のみ
AWS provides kernel live patches for an Amazon Linux 2 kernel version for up to 3 months after its release. After the 3-month period, you must update to a later kernel version to continue to receive kernel live patches.
(引用元:Kernel Live Patching on Amazon Linux 2)
Amazon Linux 2 がカーネルライブパッチを受けれるのは 3 ヶ月間のみです。3 ヶ月が経過すると当該カーネルバージョンでの新しいカーネルライブパッチはリリースされなくなります。よって、引き続きカーネルライブパッチを受信するためには、インスタンスを再起動してカーネルバージョンをアップデートする必要があります。
制限事項
- カーネルライブパッチを適用している間は、休止状態を実行したり、高度なデバッグツール(SystemTap、kprobes、eBPFベースのツールなど)を使用したり、カーネルライブパッチインフラストラクチャで使用されるftrace出力ファイルにアクセスしたりすることはできません。
やってみる
事前準備としてちょっと古い AMI を利用して EC2 を起動しておきます。
- AMI: amzn2-ami-hvm-2.0.20200406.0-x86_64-gp2 (ami-0f310fced6141e627)
カーネルライブパッチの有効化
まず、カーネルライブパッチの利用前提である、カーネルバージョン 4.14.165-131.185 以降
であることを確認します。
$ sudo yum list kernel 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd インストール済みパッケージ kernel.x86_64 4.14.173-137.229.amzn2 installed 利用可能なパッケージ kernel.x86_64 4.14.181-140.257.amzn2 amzn2-core
カーネルライブパッチを利用するために yum-plugin-kernel-livepatch
をインストールします。
$ sudo yum install -y yum-plugin-kernel-livepatch
カーネルライブパッチ用のプラグインを有効化します。
$ sudo yum kernel-livepatch enable -y
上記コマンドで最新の kernel-livepatch
もインストールされます。正常にインストールされていることを確認します。
$ rpm -qa | grep kernel-livepatch kernel-livepatch-4.14.173-137.229-1.0-0.amzn2.x86_64 yum-plugin-kernel-livepatch-1.0-0.8.amzn2.noarch
kpatch
サービスをアップデートし、開始します。kpatch
は初期化時または起動時にすべてのカーネルライブパッチをロードします。
$ sudo yum update kpatch-runtime $ sudo systemctl enable kpatch.service Created symlink from /etc/systemd/system/multi-user.target.wants/kpatch.service to /usr/lib/systemd/system/kpatch.service.
カーネルライブパッチが含まれる Amazon Linux 2 カーネルライブパッチリポジトリを設定します。
$ sudo amazon-linux-extras enable livepatch <--snip--> 43 livepatch=latest enabled [ =stable ] <--snip-->
これでカーネルライブパッチの有効化は完了です。
利用可能なカーネルライブパッチの表示
yum updateinfo list
で利用可能なカーネルライブパッチを確認することができます。カーネルライブパッチには ALASLIVEPATCH
のプレフィックスが付与されています。
$ yum updateinfo list 読み込んだプラグイン:extras_suggestions, kernel-livepatch, langpacks, priorities, update-motd amzn2-core/2/x86_64 | 3.7 kB 00:00:00 amzn2extra-docker/2/x86_64 | 3.0 kB 00:00:00 amzn2extra-livepatch/2/x86_64 | 3.0 kB 00:00:00 amzn2extra-livepatch/2/x86_64/updateinfo | 2.5 kB 00:00:00 amzn2extra-livepatch/2/x86_64/primary_db | 10 kB 00:00:00 ALAS2-2020-1440 important/Sec. kernel-4.14.177-139.253.amzn2.x86_64 ALAS2-2020-1425 important/Sec. kernel-4.14.177-139.254.amzn2.x86_64 ALAS2-2020-1431 important/Sec. kernel-4.14.181-140.257.amzn2.x86_64 ALAS2LIVEPATCH-2020-009 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-2.amzn2.x86_64 ALAS2LIVEPATCH-2020-013 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-3.amzn2.x86_64 ALAS2LIVEPATCH-2020-019 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-4.amzn2.x86_64 ALAS2LIVEPATCH-2020-022 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-5.amzn2.x86_64 ALAS2-2020-1432 medium/Sec. python-2.7.18-1.amzn2.x86_64 ALAS2-2020-1432 medium/Sec. python-devel-2.7.18-1.amzn2.x86_64 ALAS2-2020-1432 medium/Sec. python-libs-2.7.18-1.amzn2.x86_64 updateinfo list done
CVE で表示する場合は以下のようになります。
$ yum updateinfo list cves 読み込んだプラグイン:extras_suggestions, kernel-livepatch, langpacks, priorities, update-motd CVE-2020-12657 important/Sec. kernel-4.14.177-139.253.amzn2.x86_64 CVE-2020-12826 important/Sec. kernel-4.14.177-139.253.amzn2.x86_64 CVE-2020-10711 important/Sec. kernel-4.14.177-139.254.amzn2.x86_64 CVE-2020-10751 important/Sec. kernel-4.14.181-140.257.amzn2.x86_64 CVE-2020-1749 important/Sec. kernel-4.14.181-140.257.amzn2.x86_64 CVE-2019-19768 important/Sec. kernel-4.14.181-140.257.amzn2.x86_64 CVE-2019-19319 important/Sec. kernel-4.14.181-140.257.amzn2.x86_64 CVE-2020-12770 important/Sec. kernel-4.14.181-140.257.amzn2.x86_64 CVE-2020-10711 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-2.amzn2.x86_64 CVE-2020-12657 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-3.amzn2.x86_64 CVE-2019-19319 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-4.amzn2.x86_64 CVE-2020-1749 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-5.amzn2.x86_64 CVE-2018-20852 medium/Sec. python-2.7.18-1.amzn2.x86_64 CVE-2020-8492 medium/Sec. python-2.7.18-1.amzn2.x86_64 CVE-2018-20852 medium/Sec. python-devel-2.7.18-1.amzn2.x86_64 CVE-2020-8492 medium/Sec. python-devel-2.7.18-1.amzn2.x86_64 CVE-2018-20852 medium/Sec. python-libs-2.7.18-1.amzn2.x86_64 CVE-2020-8492 medium/Sec. python-libs-2.7.18-1.amzn2.x86_64 updateinfo list done
カーネルライブパッチの適用
カーネルライブパッチの適用は通常と同じく yum install
で適用します。指定するカーネルが kernel-livepatch
であること以外、特に操作に変わりはありません。
先ほどのリストから ALASLIVEPATCH
のプレフィックスが付いたアップデートを適用します。
$ sudo yum install kernel-livepatch-4.14.173-137.229-1.0-5.amzn2.x86_64
適用されたカーネルライブパッチは kpatch list
コマンドで確認できます。
$ kpatch list Loaded patch modules: livepatch_CVE_2019_19319 [enabled] livepatch_CVE_2020_10711 [enabled] livepatch_CVE_2020_12657 [enabled] livepatch_CVE_2020_1749 [enabled] Installed patch modules: livepatch_CVE_2019_19319 (4.14.173-137.229.amzn2.x86_64) livepatch_CVE_2020_10711 (4.14.173-137.229.amzn2.x86_64) livepatch_CVE_2020_12657 (4.14.173-137.229.amzn2.x86_64) livepatch_CVE_2020_1749 (4.14.173-137.229.amzn2.x86_64)
ただしカーネルライブパッチだけをインストールしても、カーネルバージョンが更新されない点はご注意ください。カーネルライブパッチ
$ sudo yum list kernel 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd インストール済みパッケージ kernel.x86_64 4.14.173-137.229.amzn2 installed 利用可能なパッケージ kernel.x86_64 4.14.181-140.257.amzn2 amzn2-core $ uname -r 4.14.173-137.229.amzn2.x86_64
利用可能なカーネルライブパッチと、通常のセキュリティアップデートを適用すると、再起動後にはカーネルバージョンがアップデートされています。
$ sudo yum update --security $ sudo reboot $ sudo yum list kernel 読み込んだプラグイン:extras_suggestions, kernel-livepatch, langpacks, priorities, update-motd インストール済みパッケージ kernel.x86_64 4.14.173-137.229.amzn2 installed kernel.x86_64 4.14.181-140.257.amzn2 @amzn2-core $ uname -r 4.14.181-140.257.amzn2.x86_64
再起動後、kpatch list
で確認するとカーネルライブパッチはロードされていないことが判ります。
$ kpatch list Loaded patch modules: Installed patch modules: livepatch_CVE_2019_19319 (4.14.173-137.229.amzn2.x86_64) livepatch_CVE_2020_10711 (4.14.173-137.229.amzn2.x86_64) livepatch_CVE_2020_12657 (4.14.173-137.229.amzn2.x86_64) livepatch_CVE_2020_1749 (4.14.173-137.229.amzn2.x86_64)
検証は以上です!
さいごに
カーネルライブパッチのサポートによって、緊急度の高い脆弱性への修正などをアプリーケーションを停止することなく迅速に対応することが可能となりました。これまで運用担当者を悩ませていた停止調整を軽減してくれる嬉しいアップデートですね。
ただし、カーネルライブパッチは再起動によるメンテナンスを完全に排除するものではないため、従来どおり定期的なメンテナンス計画は必要である点、ご注意ください。
以上!大阪オフィスの丸毛(@marumo1981)でした!